#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <ctime>
#include <cassert>
#include <sys/stat.h>

namespace bitlog{
    namespace util{
        class date {//获取当前时间
            public:
            static size_t now() { return (size_t)time(nullptr); }//将当前时间（秒）转换为size_t类型并返回
        };
        class file{
            public:
                static bool exists(const std::string &name) {//判断是否存在
                    struct stat st;//用于存储文件或目录的状态信息(stat)
                    return stat(name.c_str(), &st) == 0;//获取名为 name 的文件或目录的状态信息，并将其存储在 st 中
                    //检查文件或目录name是否存在，存在则返回true，否则返回false
                }
                //用于从完整的文件或目录路径中提取出目录路径
                static std::string path(const std::string &name) {
                    if (name.empty()) return ".";//如果 name 为空，则返回点号（.）表示当前目录
                    size_t pos = name.find_last_of("/\\");//在 name 中查找最后一个斜杠（/ 或 \）的位置，并存储在 pos 中
                    if (pos == std::string::npos) return ".";//如果未找到斜杠（pos 为 npos），则返回点号（.）表示当前目录
                    return name.substr(0, pos + 1);//返回 name 中从开头到最后一个斜杠（包括斜杠）的子字符串，即目录路径
                }
                //idx(索引)，pos(position)
                static void create_directory(const std::string &path) { //创建目录
                    if (path.empty()) return ;//如果路径为空，则直接返回，不执行后续操作
                    if (exists(path)) return ;//如果路径已存在（假设exists函数检查路径是否存在），则直接返回，不创建新目录
                    size_t pos, idx = 0;//声明两个变量：pos用于存储找到的分隔符位置，idx用于遍历路径字符串，初始化为0
                    while(idx < path.size()) {//开始一个循环，直到遍历完整个路径字符串
                        pos = path.find_first_of("/\\", idx);//从当前idx位置开始，在路径字符串中查找第一个分隔符（/或\）的位置
                        if (pos == std::string::npos) {//如果没有找到分隔符（npos是未找到的位置标记），则执行以下操作
                            mkdir(path.c_str(), 0755);//创建最终路径所指的目录（假设mkdir函数用于创建目录，0755是权限设置）
                            return;
                        }
                        if (pos == idx) {idx = pos + 1; continue;}//如果分隔符位于当前idx位置，则跳过该分隔符，继续下一个字符的查找
                        std::string subdir = path.substr(0, pos);
                        //提取从路径开始到当前分隔符位置之前的子字符串，作为子目录名
                        if (subdir == "." || subdir == "..") {idx = pos + 1; continue;}
                        //如果子目录名是.或..，则跳过该子目录，继续下一个字符的查找
                        if (exists(subdir)) {idx = pos + 1; continue;}
                        //如果子目录已存在，则跳过该子目录，继续下一个字符的查找
                        mkdir(subdir.c_str(), 0755);//创建子目录（假设mkdir函数用于创建目录，0755是权限设置）
                        idx = pos + 1;//更新idx为当前分隔符位置的下一个字符，以便继续查找   
                    }
                }
                //这段代码的作用是递归地创建给定路径的目录结构（如果它们尚不存在）。
                //它按路径中的分隔符（/ 或 \）分割路径，然后逐级检查并创建目录，直到整个路径被完整创建。
        };
    }
}